package chapter3_对象共享.三volatile;

/**
 * volatile只能确保变量可见性，不能确保对其操作的原子性；
 * 对变量加锁既可以保证对其操作的原子性，又可以保证其可见性；
 */
public class VolatileUse {
    volatile boolean sleep = false;

    /**
     * 经典用法：常用于操作完成，发生中断或者状态的标志位
     */
    public void sleepLoop() {
        //... ...
        while (sleep) {
            //countSheep();
        }
    }

    volatile static int count = 0;
    /**
     * volatile 不能用于count++，不确保count++的原子性
     *
     * 3.2Ghz频率，没有模拟出并发安全问题
     * @param args
     */
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 1000000; i++) {
                    count++;
                    System.out.printf("子线程1循环次数:%d \r\n", i);
                }
            }
        };
        thread1.start();

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 1000000; i++) {
                    count++;
                    System.out.printf("子线程2循环次数:%d  \n", i);
                }
            }
        };
        thread2.start();

        thread1.join();
        thread2.join();
        System.out.printf("执行预想结果:2000000  实际结果:%d  \n", count);
    }
}
